package com.cw.lang.common.framework.aop.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import com.cw.base.common.model.enums.EnumModuleCode;
import com.cw.base.common.model.enums.EnumRpcExceptionConfig;
import com.cw.base.common.model.enums.EnumServiceScene;

/**
 * 该注解有2个作用<br>
 * 一个是用于Integration层参数的构造，主要是{@link BaseRequest}和{@link BaseUserRequest}这2个参数<br>
 * 该注解可注解类上或者方法上，优先使用方法上的值，如果方法上的值不存在或者是未知 <br>
 * 例如：<br>
 * {@link IntegrationHandler#ask()}、{@link IntegrationHandler#answer()}设置为{@link EnumModuleCode#UNKNOWN}
 * {@link IntegrationHandler#serviceScene()}设置为{@link EnumServiceScene#UNKNOWN}
 *
 * 如上两种情况，在aop层就会抛异常
 *
 *
 * PS: {@link IntegrationHandler}被注解的方法不能被final修饰，否则无法被spring-aop代理<br>
 * PS: {@link #idemSerialNo()}支持使用spEL表达式，例如如下注释
 *
 * <pre>
 * &#64;IntegrationHandler(ask = EnumModuleCode.CREDIT, answer = EnumModuleCode.ASSET,
 *     serviceScene = EnumServiceScene.CONFIRM, idemSerialNo = "#tradeId")
 * public void loan(String tradeId) {
 *
 * }
 * </pre>
 *
 * @author chenw
 * @version $$Id: IntegrationHandler.java, v 0.1 2018/9/21 上午9:13 chenw Exp $$
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface IntegrationHandler {

    /**
     * 请求模块
     *
     * @return 请求模块
     */
    EnumModuleCode ask() default EnumModuleCode.UNKNOWN;

    /**
     * 响应模块
     *
     * @return 响应模块
     */
    EnumModuleCode answer() default EnumModuleCode.UNKNOWN;

    /**
     * 服务场景
     *
     * @return 服务场景
     */
    EnumServiceScene serviceScene() default EnumServiceScene.UNKNOWN;

    /**
     * 幂等流水号，支持使用spEL
     *
     * @return 幂等流水号
     */
    String idemSerialNo() default "";

    /**
     * RPC异常时，是抛异常还是组装为{@link CommonResponse}，默认抛异常
     *
     * @return {@link EnumRpcExceptionConfig#TRUE}-抛异常，{@link EnumRpcExceptionConfig#FALSE}-组装{@link CommonResponse}，{@link EnumRpcExceptionConfig#UNKNOWN}默认值-抛异常
     */
    EnumRpcExceptionConfig isRpcExceptionThrowEnabled() default EnumRpcExceptionConfig.UNKNOWN;
}
